/*
 * Date: 2021/4/8
 * Author: January
 * Description: 日志消息打印接口头文件，仅用于DEBUG测试，需要提供printf的实现
 *              才能使用。
 */

#ifndef SECSERIAL_LOG_H
#define SECSERIAL_LOG_H

#ifdef __cplusplus
extern "C"
{
#endif
// Reset
#define ColorOff "\033[0m"

// Regular Colors(用于给终端打印彩色字符)
#define Red "\033[0;31m"
#define Yellow "\033[0;33m"
#define Green "\033[0;32m"

void printBytes(const void* bytes, int len, const char* prompt);

#ifndef S_MODULE_NAME
#define S_MODULE_NAME
#endif


// log level 定义，暂未使用
#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO 1
#define LOG_LEVEL_WARNING 2
#define LOG_LEVEL_ERR 3

// define printf implementation
#ifndef IMP_PRINTF
#define IMP_PRINTF printf
#endif

#ifdef NO_LINE_END
#define END 
#else
#define END "\n"
#endif
// #define CONFIG_DEBUG
// DEBUG日志
#ifdef CONFIG_DEBUG
#define LOG_DEBUG_VERBOSE(fmt, ...) IMP_PRINTF("[DEBUG]" S_MODULE_NAME "file: %s, line: %d, " fmt END, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(fmt, ...) IMP_PRINTF("[DEBUG] " S_MODULE_NAME fmt END, ##__VA_ARGS__)
#define LOG_DEBUG_MEM(addr, len, fmt, ...) \
do {                                       \
    IMP_PRINTF("[DEBUG] " S_MODULE_NAME fmt END, ##__VA_ARGS__); \
    printBytes(addr, len, NULL);           \
}while(0)
#else
#define LOG_DEBUG_VERBOSE(fmt, ...)
#define LOG_DEBUG(fmt, ...)
#define LOG_DEBUG_MEM(addr, len, fmt, ...)
#endif

// INFO日志
// #define LOG_INFO(fmt, ...)
#define LOG_INFO(fmt, ...) IMP_PRINTF("[INFO] " S_MODULE_NAME fmt END, ##__VA_ARGS__)
#define LOG_INFO_MEM(addr, len, fmt, ...) \
do {                                       \
    IMP_PRINTF("[INFO] " S_MODULE_NAME fmt END, ##__VA_ARGS__); \
    printBytes(addr, len, NULL);           \
}while(0)
#define LOG_INFO_SAME_LINE(fmt, ...) IMP_PRINTF("[INFO] " S_MODULE_NAME fmt "\r", ##__VA_ARGS__)

// WARNING日志
#define LOG_WARNING(fmt, ...) IMP_PRINTF(Yellow "[WARNING] " S_MODULE_NAME fmt END ColorOff, ##__VA_ARGS__)
// ERROR日志
#define LOG_ERROR(fmt, ...) IMP_PRINTF(Red "[ERROR] " S_MODULE_NAME fmt END ColorOff, ##__VA_ARGS__)

// 打印数据（没有额外头部信息）
#define NOTICE(fmt, ...) IMP_PRINTF(fmt END, ##__VA_ARGS__)
#define NOTICE_MEM(addr, len, fmt, ...) \
do {                                       \
    IMP_PRINTF(fmt END, ##__VA_ARGS__); \
    printBytes(addr, len, NULL);           \
}while(0)

#ifdef __cplusplus
}
#endif
#endif //SECSERIAL_LOG_H
